feat: FDv2 Cache Initializer#1147
Conversation
|
@launchdarkly/js-sdk-common size report |
|
@launchdarkly/browser size report |
|
@launchdarkly/js-client-sdk size report |
|
@launchdarkly/js-client-sdk-common size report |
| } | ||
| }, | ||
| initCached(context: Context, newFlags: { [key: string]: ItemDescriptor }) { | ||
| initCached(context: Context, newFlags: { [key: string]: ItemDescriptor }, _freshness?: number) { |
There was a problem hiding this comment.
We aren't doing anything with this yet, but likely we will want to expose it from the flag manager.
|
bugbot review |
| @@ -121,16 +136,22 @@ export default class FlagPersistence { | |||
| } | |||
|
|
|||
| private async _storeCache(context: Context): Promise<void> { | |||
There was a problem hiding this comment.
With this change we start recording freshness even in the FDv1 path.
| @@ -56,47 +63,55 @@ export default class FlagPersistence { | |||
| * {@link FlagUpdater} this {@link FlagPersistence} was constructed with. | |||
| */ | |||
| async loadCached(context: Context): Promise<boolean> { | |||
There was a problem hiding this comment.
Once we remove V1 support this loading path will be removed.
🤖 I have created a release *beep* *boop* --- <details><summary>browser: 0.1.12</summary> ## [0.1.12](browser-v0.1.11...browser-v0.1.12) (2026-03-16) ### Dependencies * The following workspace dependencies were updated * dependencies * @launchdarkly/js-client-sdk bumped from 4.3.1 to 4.4.0 </details> <details><summary>browser-telemetry: 1.0.28</summary> ## [1.0.28](browser-telemetry-v1.0.27...browser-telemetry-v1.0.28) (2026-03-16) ### Dependencies * The following workspace dependencies were updated * devDependencies * @launchdarkly/js-client-sdk bumped from 4.3.1 to 4.4.0 </details> <details><summary>jest: 1.0.7</summary> ## [1.0.7](jest-v1.0.6...jest-v1.0.7) (2026-03-16) ### Dependencies * The following workspace dependencies were updated * dependencies * @launchdarkly/react-native-client-sdk bumped from ~10.14.1 to ~10.15.0 </details> <details><summary>js-client-sdk: 4.4.0</summary> ## [4.4.0](js-client-sdk-v4.3.1...js-client-sdk-v4.4.0) (2026-03-16) ### Features * Add experimental FDv2 configuration (unused) ([#1169](#1169)) ([c7130cc](c7130cc)) * create @launchdarkly/js-contract-test-utils package ([#1163](#1163)) ([2de5c27](2de5c27)) ### Bug Fixes * Allow 0 status code to be handled by the streaming error filter. ([d96b46b](d96b46b)) * Improve error handling for FDv2 streaming ([d96b46b](d96b46b)) ### Dependencies * The following workspace dependencies were updated * dependencies * @launchdarkly/js-client-sdk-common bumped from 1.21.0 to 1.22.0 </details> <details><summary>js-client-sdk-common: 1.22.0</summary> ## [1.22.0](js-client-sdk-common-v1.21.0...js-client-sdk-common-v1.22.0) (2026-03-16) ### Features * Add experimental FDv2 configuration (unused) ([#1169](#1169)) ([c7130cc](c7130cc)) * Add explicit disableCache setting. ([6be89dd](6be89dd)) * Add FDv1 polling synchronizer for FDv2 fallback (SDK-1923) ([#1159](#1159)) ([498216a](498216a)) * Add mode resolution table for FDv2. ([#1146](#1146)) ([ab2436d](ab2436d)) * FDv2 Cache Initializer ([#1147](#1147)) ([7d6299f](7d6299f)) ### Bug Fixes * Allow 0 status code to be handled by the streaming error filter. ([d96b46b](d96b46b)) * Fix the calculation of the basis parameter for FDv2 streaming. (Does not affect FDv1). ([#1165](#1165)) ([bbdd6c6](bbdd6c6)) * Improve error handling for FDv2 streaming ([d96b46b](d96b46b)) * Max cached context enforcement wasn't working for 0. ([6be89dd](6be89dd)) * rename FDv2 object kind from `flagEval` to `flag-eval` ([#1185](#1185)) ([cd4b119](cd4b119)) </details> <details><summary>react-native-client-sdk: 10.15.0</summary> ## [10.15.0](react-native-client-sdk-v10.14.1...react-native-client-sdk-v10.15.0) (2026-03-16) ### Features * Add experimental FDv2 configuration (unused) ([#1169](#1169)) ([c7130cc](c7130cc)) * create @launchdarkly/js-contract-test-utils package ([#1163](#1163)) ([2de5c27](2de5c27)) ### Dependencies * The following workspace dependencies were updated * dependencies * @launchdarkly/js-client-sdk-common bumped from 1.21.0 to 1.22.0 </details> <details><summary>server-sdk-ai: 0.16.6</summary> ## [0.16.6](server-sdk-ai-v0.16.5...server-sdk-ai-v0.16.6) (2026-03-16) ### Bug Fixes * Make defaultValue optional with a disabled default ([#1144](#1144)) ([e46769b](e46769b)) </details> <details><summary>server-sdk-ai-langchain: 0.5.2</summary> ## [0.5.2](server-sdk-ai-langchain-v0.5.1...server-sdk-ai-langchain-v0.5.2) (2026-03-16) ### Dependencies * The following workspace dependencies were updated * devDependencies * @launchdarkly/server-sdk-ai bumped from ^0.16.5 to ^0.16.6 * peerDependencies * @launchdarkly/server-sdk-ai bumped from ^0.15.0 || ^0.16.0 to ^0.16.6 </details> <details><summary>server-sdk-ai-openai: 0.5.2</summary> ## [0.5.2](server-sdk-ai-openai-v0.5.1...server-sdk-ai-openai-v0.5.2) (2026-03-16) ### Dependencies * The following workspace dependencies were updated * devDependencies * @launchdarkly/server-sdk-ai bumped from ^0.16.5 to ^0.16.6 * peerDependencies * @launchdarkly/server-sdk-ai bumped from ^0.15.0 || ^0.16.0 to ^0.16.6 </details> <details><summary>server-sdk-ai-vercel: 0.5.2</summary> ## [0.5.2](server-sdk-ai-vercel-v0.5.1...server-sdk-ai-vercel-v0.5.2) (2026-03-16) ### Dependencies * The following workspace dependencies were updated * devDependencies * @launchdarkly/server-sdk-ai bumped from ^0.16.5 to ^0.16.6 * peerDependencies * @launchdarkly/server-sdk-ai bumped from ^0.15.0 || ^0.16.0 to ^0.16.6 </details> --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please). <!-- CURSOR_SUMMARY --> --- > [!NOTE] > **Low Risk** > Primarily automated release/version bumps and changelog updates across multiple packages; no functional code changes beyond embedded SDK version constants and dependency bumps. > > **Overview** > Publishes a new release across the monorepo by bumping versions in `.release-please-manifest.json`, updating package `CHANGELOG.md`s, and syncing `package.json` dependency ranges. > > Notable bumps include `@launchdarkly/js-client-sdk` to `4.4.0` (and `@launchdarkly/js-client-sdk-common` to `1.22.0`), `@launchdarkly/react-native-client-sdk` to `10.15.0`, `@launchdarkly/server-sdk-ai` to `0.16.6`, and corresponding provider/aggregator packages (`server-sdk-ai-*`, `@launchdarkly/browser`, `browser-telemetry`, `@launchdarkly/jest`). > > <sup>Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit a6d9634. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).</sup> <!-- /CURSOR_SUMMARY --> Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Note
Medium Risk
Touches persistence and FDv2 data-source plumbing by adding new cached-data paths and new storage keys, which could affect startup behavior and cache correctness across contexts. Changes are well-covered by new unit tests but still impact core flag loading/poll timing logic.
Overview
Adds an FDv2
CacheInitializerthat loads cached flag evaluations from persistent storage (including legacy-key fallback), returns them as a changeSet without a selector, and supports early shutdown viaclose().Introduces cache “freshness” metadata:
FlagPersistencenow writes/evicts{contextKey}_freshnessrecords (timestamp + context hash),readFreshnessvalidates them, andFDv2SourceResult.changeSetcan carry an optionalfreshnessvalue; also addscalculatePollDelayto derive the next poll delay from freshness.Refactors/expands tests to cover the new cache initializer, freshness persistence/eviction, and updates existing storage tests for the additional storage writes; shared test helpers are centralized in
flagManagerTestHelpers.ts.Written by Cursor Bugbot for commit ccae06f. This will update automatically on new commits. Configure here.